package pimmodel;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.List;

/**
 * 
 * Interface ITerminList:<br>
 * Das Interface zur Klasse TerminList.
 * 
 * @author Thomas Schoenfeld
 * @version (20120909_01)
 *
 */
public interface ITerminList {

	/**
	 * getTerminliste 			gibt die Liste der Termine sortiert zurueck
	 * 
	 * @return					die Terminliste
	 */
	public abstract List<ITermin> getTerminliste();

	/**
	 * setTerminliste			tauscht die alten gegen neue Termindaten aus
	 * 
	 * @param	terminliste	die Liste mit den neuen Termindaten
	 * 
	 * @throws	NullPointerException falls das uebergebene Objekt null ist.
	 * @throws	IllegalArgumentException falls ein Listenelement nicht vom Typ ITermin ist.
	 */
	public abstract void setTerminliste(List<ITermin> terminliste);

	/**
	 * terminErsetzen			ersetzt alten durch neuen Termin in der Liste
	 * 
	 * @param	bearKont		bearbeiteter Termin
	 * @param	orgKont			urspruenglicher Termin
	 * 
	 * @return					true falls Ersetzen erfolgt, false sonst 
	 * 
	 * @throws					IllegalArgumentException falls die uebergebenen Objekte nicht vom Typ ITermin sind.
	 */
	public abstract boolean terminErsetzen(ITermin bearTermin, ITermin orgTermin);

	/**
	 * terminHinzufuegen		fuegt einen Termin der Liste hinzu
	 * 
	 * @param	neuTermin		neuer Termin
	 * 
	 * @return					true falls Hinzufuegen erfolgt, false sonst
	 * 
	 * @throws					IllegalArgumentException falls das uebergebene Objekt nicht vom Typ ITermin ist.
	 */
	public abstract boolean terminHinzufuegen(ITermin neuTermin);

	/** 
	 * terminLoeschen			loescht einen Termin in der Liste
	 * 
	 * @param	loeschTermin	zu loeschender Termin
	 * 
	 * @return					true falls Loeschung erfolgt, false sonst
	 * 
	 * @throws					IllegalArgumentException falls das uebergebene Objekt nicht vom Typ ITermin ist.
	 */
	public abstract boolean terminLoeschen(ITermin loeschTermin);

	/**
	 * terminLiefern			sucht einen Index und gibt Objekt vom Typ ITermin zurueck
	 * 
	 * @param	index			der zu suchende Index
	 * 
	 * @return					der gefundene Termin oder null, falls Suche erfolglos
	 * 
	 * @throws					IndexOutOfBoundsException falls der uebergebene Index ausserhalb der Datenstruktur liegt.
	 */
	public abstract ITermin terminLiefern(int index);

	/**
	 * terminNameSuchen		sucht einen terminnamen und gibt Index zurueck
	 * 
	 * @param	terminName		der zu suchende terminname
	 * 
	 * @return					der ermittelte Index oder -1 falls nicht gefunden 
	 * 
	 * @throws					IllegalArgumentException falls kein gueltiger String uebergeben wurde	
	 */
	public abstract int terminNameSuchen(String terminName);

	/**
	 * terminSuchen				sucht einen Termin
	 * 
	 * @param	suchTermin		der zu suchende Termin	
	 * 
	 * @return					der ermittelte Index oder -1 falls nicht gefunden
	 * 
	 * @throws					IllegalArgumentException falls das uebergebene Objekte nicht vom Typ ITermin ist.
	 */
	public abstract int terminSuchen(ITermin suchTermin);

	/**
	 * toArray					wandelt Liste in Array um und gibt dieses zurueck
	 * 
	 * @return					das erzeugte Array
	 */
	public abstract Object[] toArray();

	/**
	 * clear					loescht alle Termine
	 */
	public abstract void clear();

	/**
	 * clone					liefert flache Kopie der Terminliste
	 * 
	 * @return					flache Kopie der Terminliste
	 */
	public abstract ITerminList clone();

	/**
	 * isEmpty					prueft, ob die Terminliste leer ist
	 * 
	 * @return					true falls leer, false sonst
	 */
	public abstract boolean isEmpty();

	/**
	 * size						gibt die Anzahl der Elemente in der Liste zurueck
	 * 
	 * @return					die Anzahl der Listenelemente
	 */
	public abstract int size();

	/**
	 * toString					gibt Objektbeschreibung als String zurueck
	 * 
	 * @return					die Objektbeschreibung als String
	 */
	public abstract String toString();

	/**
	 * hashCode					liefert den Hashcode des Objekts als Integer zurueck
	 * 
	 * @return					den Hashcode des Objekts
	 * 
	 * @overrides				hashCode()
	 */
	public abstract int hashCode();

	/**
	 * equals					untersucht das Objekt mit einem uebergebenen Objekt auf Gleichheit
	 * 
	 * @param	obj				das mit diesem Objekt zu vergleichende Objekt
	 * 
	 * @return					true bei Gleichheit, sonst false
	 * 
	 * @overrides				equals()
	 */
	public abstract boolean equals(Object obj);

	/*
	 * (non-Javadoc)
	 * 
	 * @see pimmodel.ITerminList#speichern()
	 */
	public abstract void speichern(String dateiname)
			throws FileNotFoundException, IOException;

	/*
	 * (non-Javadoc)
	 * 
	 * @see pimmodel.ITerminList#laden()
	 */
	public abstract void laden(String dateiname) throws IOException,
			ClassNotFoundException;

	// interne Sortier-Methode
	public abstract void sortieren();

}